package pl.enigmatic.validation.util;

import pl.enigmatic.validation.SimpleValidator;


public abstract class IntegerValidator implements SimpleValidator<Integer> {

	public static final SimpleValidator<Integer> NOT_NULL = new NotNull<Integer>();

	public static final IntegerValidator LT(final int max) {
		return new IntegerValidator() {

			@Override
			public boolean isValueValid(final Integer val) {
				return NOT_NULL.isValueValid(val) && val < max;
			}
		};
	}

	public static final IntegerValidator LE(final int max) {
		return new IntegerValidator() {

			@Override
			public boolean isValueValid(final Integer val) {
				return NOT_NULL.isValueValid(val) && val <= max;
			}
		};
	}

	public static final IntegerValidator GT(final int min) {
		return new IntegerValidator() {

			@Override
			public boolean isValueValid(final Integer val) {
				return NOT_NULL.isValueValid(val) && val > min;
			}
		};
	}

	public static final IntegerValidator GE(final int min) {
		return new IntegerValidator() {

			@Override
			public boolean isValueValid(final Integer val) {
				return NOT_NULL.isValueValid(val) && val >= min;
			}
		};
	}

	public static final IntegerValidator BETWEEN(final int min, final int max) {
		return new IntegerValidator() {

			private final IntegerValidator le = LE(max);
			private final IntegerValidator ge = GE(min);

			@Override
			public boolean isValueValid(final Integer val) {
				return le.isValueValid(val) && ge.isValueValid(val);
			}
		};
	}

	public static final IntegerValidator OUTSIDE(final int min, final int max) {
		return new IntegerValidator() {

			private final IntegerValidator between = BETWEEN(min, max);

			@Override
			public boolean isValueValid(final Integer val) {
				return !between.isValueValid(val);
			}
		};
	}

	private IntegerValidator() {}

}
